package cn.com.blueInfo.bpm.system.service.impl;

import cn.com.blueInfo.bpm.system.convert.DictItemConvert;
import cn.com.blueInfo.bpm.system.entity.DictItem;
import cn.com.blueInfo.bpm.system.repository.DictItemRepository;
import cn.com.blueInfo.bpm.system.request.DictItemDTO;
import cn.com.blueInfo.bpm.system.response.DictItemVO;
import cn.com.blueInfo.bpm.system.service.DictItemService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 枚举项表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:17:41
 */
@Log4j2
@Service
public class DictItemServiceImpl implements DictItemService {

    @Autowired
    private DictItemRepository dictItemRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private DictItemConvert dictItemConvert;

    /**
     * 新增枚举项
     * @param dictItemDTO 枚举项参数
     */
    @Override
    public ResultInfo<Integer> addDictItem(DictItemDTO dictItemDTO) {
        DictItem dictItem = dictItemConvert.dtoToEntity(dictItemDTO);
        dictItem.setId(snowflakeIdGenerator.nextId());
        Integer addSize = dictItemRepository.createDictItem(dictItem);
        return ResultInfo.<Integer>builder().data(addSize).message("枚举项成功新增 {} 条").build();
    }

    /**
     * 批量新增枚举项
     * @param dictItemDTOList 枚举项参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddDictItem(List<DictItemDTO> dictItemDTOList) {
        List<DictItem> dictItemList = dictItemConvert.dtoToEntity(dictItemDTOList);
        for (DictItem dictItem : dictItemList) dictItem.setId(snowflakeIdGenerator.nextId());
        Integer addSize = dictItemRepository.batchCreateDictItem(dictItemList);
        return ResultInfo.<Integer>builder().data(addSize).message("枚举项成功新增 {} 条").build();
    }

    /**
     * 删除枚举项
     * @param dictItemId 枚举项ID
     */
    @Override
    public ResultInfo<Integer> removeDictItem(Long dictItemId) {
        Integer removeSize = dictItemRepository.deleteDictItem(dictItemId);
        return ResultInfo.<Integer>builder().data(removeSize).message("枚举项成功删除 {} 条").build();
    }

    /**
     * 批量删除枚举项
     * @param dictItemIdList 枚举项ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveDictItem(List<Long> dictItemIdList) {
        Integer removeSize = dictItemRepository.batchDeleteDictItem(dictItemIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("枚举项成功删除 {} 条").build();
    }

    /**
     * 更新部分枚举项
     * @param dictItemUpdatePartialDTO 枚举项参数
     */
    @Override
    public ResultInfo<Integer> modifyDictItemPartial(DictItemDTO.UpdatePartialDTO dictItemUpdatePartialDTO) {
        DictItem dictItem = dictItemConvert.dtoToEntity(dictItemUpdatePartialDTO);
        Integer modifySize = dictItemRepository.updateDictItemPartial(dictItem);
        return ResultInfo.<Integer>builder().data(modifySize).message("枚举项成功更新 {} 条").build();
    }

    /**
     * 更新全部枚举项
     * @param dictItemDTO 枚举项参数
     */
    @Override
    public ResultInfo<Integer> modifyDictItem(DictItemDTO dictItemDTO) {
        DictItem dictItem = dictItemConvert.dtoToEntity(dictItemDTO);
        Integer modifySize = dictItemRepository.updateDictItem(dictItem);
        return ResultInfo.<Integer>builder().data(modifySize).message("枚举项成功更新 {} 条").build();
    }

    /**
     * 查询一条枚举项
     * @param dictItemId 枚举项ID
     */
    @Override
    public ResultInfo<DictItemVO> queryDictItemById(Long dictItemId) {
        DictItem dictItem = dictItemRepository.getDictItemById(dictItemId);
        DictItemVO dictItemVO = dictItemConvert.entityToVO(dictItem);
        return ResultInfo.<DictItemVO>builder().data(dictItemVO).message("枚举项查询成功").build();
    }

    /**
     * 分页查询枚举项
     * @param dictItemQueryDTO 枚举项参数
     */
    @Override
    public ResultInfo<Page<DictItemVO>> queryDictItemPage(DictItemDTO.QueryDTO dictItemQueryDTO) {
        Page<DictItem> dictItemPage = dictItemRepository.getDictItemPage(dictItemQueryDTO);
        Page<DictItemVO> resultData = dictItemConvert.convertPage(dictItemPage);
        return ResultInfo.<Page<DictItemVO>>builder()
                .data(resultData)
                .message("枚举项分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 枚举项 数量
     * @param dictItemQueryDTO 枚举项参数
     */
    @Override
    public ResultInfo<Long> queryDictItemCount(DictItemDTO.QueryDTO dictItemQueryDTO) {
        Long resultCount = dictItemRepository.getDictItemCount(dictItemQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("枚举项数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 枚举项
     * @param dictItemQueryDTO 枚举项参数
     */
    @Override
    public ResultInfo<List<DictItemVO>> queryDictItemList(DictItemDTO.QueryDTO dictItemQueryDTO) {
        List<DictItem> dictItemList = dictItemRepository.getDictItemList(dictItemQueryDTO);
        List<DictItemVO> resultData = dictItemConvert.entityListToVoList(dictItemList);
        return ResultInfo.<List<DictItemVO>>builder()
                .data(resultData)
                .message("枚举项分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
